package accesoDatos;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import entidades.*;

public class adUsuarios extends adDatos {
	public void agregarUsuario(Usuario usuarioActual)
    {
        Connection oCnn = crearConexion();

        StringBuilder sb = new StringBuilder();
        sb.append(" INSERT INTO usuarios( ");
        sb.append("     apellido, ");
        sb.append("     nombre, ");
        sb.append("     email, ");
        sb.append("     nombre_usuario, ");
        sb.append("     clave, ");
        sb.append("     habilitado, ");
        //sb.append("     cambia_clave, ");
        sb.append("     id_persona ");
        sb.append(" ) ");
        sb.append(" VALUES ( '");
       //creo q tiene q ir	el get.ej:personaActual.getApellido(). tambien hay q encerar en ''todos los valores q son String!
       //corrigo nombres como casi estoy seguro q iria. NOTAR LAS COMILLAS SIMPLES EN VALUES Y EN LA COMA.
        sb.append(      usuarioActual.getApellido()+ "','");
        sb.append(	    usuarioActual.getNombre()+ "','");
        sb.append(	    usuarioActual.getEmail()+ "','");
        sb.append(	    usuarioActual.getNombreUsuario()+ "','");
        sb.append(		usuarioActual.getClave()+ "',");
        sb.append(		usuarioActual.getHabilitado()+ ",");
        sb.append(		usuarioActual.getIdPersona());
        sb.append(" ); ");
        
		try {
			Statement cmdInsertarUsuario = oCnn.createStatement();
			cmdInsertarUsuario.executeUpdate(sb.toString());
			oCnn.close();
		} catch (SQLException e) {
			e.printStackTrace();
			System.out.println("ERROR: No se pudo agregar el usuario.");
		}
    }
	
	public void borrarUsuario(int id_usuario)
    {
        Connection oCnn = crearConexion();
        
        StringBuilder sb = new StringBuilder();

        sb.append(" DELETE FROM usuarios ");
        sb.append(" WHERE id_usuario = "+id_usuario+"; ");

        try{
        	Statement cmdBorrarUsuario = oCnn.createStatement();
        	cmdBorrarUsuario.executeUpdate(sb.toString());
        	oCnn.close();
        } catch (SQLException e) {
			e.printStackTrace();
			System.out.println("ERROR: No se pudo borrar el Usuario.");
		}
    }
	
	public void modificarUsuario(Usuario usuarioActual)
	{
        Connection oCnn = crearConexion();

        StringBuilder sb = new StringBuilder();
        sb.append(" UPDATE usuarios ");
        sb.append(" SET  ");
        sb.append("     nombre = '"+usuarioActual.getNombre()+"' ");
        sb.append("     ,apellido = '"+usuarioActual.getApellido()+"' ");
        sb.append("     ,nombre_usuario = '"+usuarioActual.getNombreUsuario()+"' ");
        sb.append("     ,email = '"+usuarioActual.getEmail()+"' ");
        sb.append("     ,clave = '"+usuarioActual.getClave()+"' ");
        sb.append("     ,id_persona = "+usuarioActual.getIdPersona()+" ");
        sb.append("     ,habilitado = "+usuarioActual.getHabilitado()+" ");
        sb.append(" WHERE id_usuario = "+usuarioActual.getId()+" ");

        try{
        	Statement cmdModificarUsuario = oCnn.createStatement();
        	cmdModificarUsuario.executeUpdate(sb.toString());
        	oCnn.close();
        } catch (SQLException e) {
			e.printStackTrace();
			System.out.println("ERROR: No se pudo modificar el usuario.");
		}
    }
	
	public Usuario getUsuario(int id_usuario)
	{
        Usuario usuarioActual = new Usuario();
        Connection oCnn = crearConexion();

        StringBuilder sb = new StringBuilder();
        sb.append(" SELECT ");
        sb.append(" * ");
        sb.append(" FROM usuarios ");
        sb.append(" WHERE id_usuario = "+id_usuario+" ");

        try{
        	Statement cmdGetUsuario = oCnn.createStatement();
        	ResultSet rsUsuarios = cmdGetUsuario.executeQuery(sb.toString());
        	if (rsUsuarios.next() == true){
        		rsUsuarios.beforeFirst();
    	        
    	        while (rsUsuarios.next()){
    	        	usuarioActual.setId(rsUsuarios.getInt("id_usuario"));
    	        	usuarioActual.setApellido(rsUsuarios.getString("apellido"));
    	        	usuarioActual.setNombre(rsUsuarios.getString("nombre"));
    	        	usuarioActual.setNombreUsuario(rsUsuarios.getString("nombre_usuario"));
    	        	usuarioActual.setClave(rsUsuarios.getString("clave"));
    	        	usuarioActual.setEmail(rsUsuarios.getString("email"));
    	        	usuarioActual.setIdPersona(rsUsuarios.getInt("id_persona"));
    	        	usuarioActual.setHabilitado(rsUsuarios.getBoolean("habilitado"));
    	        }
    	    }
        	oCnn.close();
        } catch (SQLException e) {
			e.printStackTrace();
			System.out.println("ERROR: No se pudo obtener el usuario.");
		}
        return usuarioActual;
    }
	
	public Usuario getUsuario(String nombreUsuario)
	{
        Usuario usuarioActual = new Usuario();
        Connection oCnn = crearConexion();

        StringBuilder sb = new StringBuilder();
        sb.append(" SELECT ");
        sb.append(" * ");
        sb.append(" FROM usuarios ");
        sb.append(" WHERE nombre_usuario = '"+nombreUsuario+"' ");

        try{
        	Statement cmdGetUsuario = oCnn.createStatement();
        	ResultSet rsUsuarios = cmdGetUsuario.executeQuery(sb.toString());
        	if (rsUsuarios.next() == true){
        		rsUsuarios.beforeFirst();
    	        
    	        while (rsUsuarios.next()){
    	        	usuarioActual.setId(rsUsuarios.getInt("id_usuario"));
    	        	usuarioActual.setApellido(rsUsuarios.getString("apellido"));
    	        	usuarioActual.setNombre(rsUsuarios.getString("nombre"));
    	        	usuarioActual.setNombreUsuario(rsUsuarios.getString("nombre_usuario"));
    	        	usuarioActual.setClave(rsUsuarios.getString("clave"));
    	        	usuarioActual.setEmail(rsUsuarios.getString("email"));
    	        	usuarioActual.setIdPersona(rsUsuarios.getInt("id_persona"));
    	        	usuarioActual.setHabilitado(rsUsuarios.getBoolean("habilitado"));
    	        }
    	    }
        	oCnn.close();
        } catch (SQLException e) {
			e.printStackTrace();
			System.out.println("ERROR: No se pudo obtener el usuario.");
		}
        return usuarioActual;
    }
	
	public ArrayList<Usuario> recuperarTodos()
	{
        Connection oCnn = crearConexion();
        ArrayList<Usuario> listaUsuarios = new ArrayList<Usuario>();
        Usuario usuarioActual = new Usuario();

        String sql = "SELECT * FROM usuarios";

        try{
        	Statement cmdRecuperarUsuarios = oCnn.createStatement();
        	ResultSet rsUsuarios = cmdRecuperarUsuarios.executeQuery(sql);
        	if (rsUsuarios.next()==true){
        		rsUsuarios.beforeFirst();
    	        
    	        while (rsUsuarios.next()){
    	        	usuarioActual.setId(rsUsuarios.getInt("id_persona"));
    	        	usuarioActual.setApellido(rsUsuarios.getString("apellido"));
    	        	usuarioActual.setNombre(rsUsuarios.getString("nombre"));
    	        	usuarioActual.setNombreUsuario(rsUsuarios.getString("nombre_usuario"));
    	        	usuarioActual.setClave(rsUsuarios.getString("clave"));
    	        	usuarioActual.setEmail(rsUsuarios.getString("email"));
    	        	usuarioActual.setHabilitado(rsUsuarios.getBoolean("fecha_nac"));
    	        	usuarioActual.setIdPersona(rsUsuarios.getInt("id_persona"));

    	            listaUsuarios.add(usuarioActual);
    	        }
    	    }
        	oCnn.close();
        } catch (SQLException e) {
			e.printStackTrace();
			System.out.println("ERROR: No se pudo obtener los Usuarios.");
		}
        return listaUsuarios;
    }
	
	public int getTipoPersona(String nombreUsuario)
	{
        Connection oCnn = crearConexion();

        int tipoPersona = 0;

        StringBuilder sb = new StringBuilder();

        sb.append(" SELECT tipo_persona ");
        sb.append(" FROM usuarios AS u INNER JOIN personas AS p ");
        sb.append("     ON u.id_persona = p.id_persona ");
        sb.append(" WHERE nombre_usuario = '"+nombreUsuario+"' ");
        
        try{
        	Statement cmdGetTipoPersona = oCnn.createStatement();
        	ResultSet rsUsuarios = cmdGetTipoPersona.executeQuery(sb.toString());
        	if (rsUsuarios.next() == true){
        		rsUsuarios.beforeFirst();
    	        
    	        while (rsUsuarios.next()){
    	        	tipoPersona = rsUsuarios.getInt("tipo_persona");
    	        }
        	}
        	oCnn.close();
        } catch(SQLException e) {
			e.printStackTrace();
			System.out.println("ERROR: No se pudo comprobar a que grupo pertenece el Usuario.");
		}
    	
        return tipoPersona;
    }
	
	public boolean validarUsuario(String nombreUsuario, String clave)
	{
        Connection oCnn = crearConexion();

        String sql = "SELECT * FROM usuarios WHERE nombre_usuario = '"+nombreUsuario+"' AND clave = '"+clave+"' ";

        try{
        	Statement cmdValidarUsuario = oCnn.createStatement();
        	ResultSet rsUsuarios = cmdValidarUsuario.executeQuery(sql);
        	if (rsUsuarios.next() == true){
        		oCnn.close();
        		return true;
        	}
        	else return false;
        	
        } catch(SQLException | NullPointerException e) {
			e.printStackTrace();
			System.out.println("ERROR: No se pudo validar el Usuario.");
		}
        return false;
    }
	
	public boolean estaHabilitado(String nombreUsuario)
	{
		Connection oCnn = crearConexion();

        String sql = "SELECT * FROM usuarios WHERE nombre_usuario = '"+nombreUsuario+"' AND habilitado = 1";

        try{
        	Statement cmdEstaHabilitado = oCnn.createStatement();
        	ResultSet rsUsuarios = cmdEstaHabilitado.executeQuery(sql);
        	if (rsUsuarios.next() == true){
        		oCnn.close();
        		return true;
        	}
        	else return false;
        	
        } catch(SQLException e) {
			e.printStackTrace();
			System.out.println("ERROR: No se pudo determinar si el Usuario esta Habilitado.");
		}
        return false;
	}
	
	public boolean validarTipoPersona(String nombre, String clave, int tipo_persona)
    {
        Connection oCnn = crearConexion();

        StringBuilder sb = new StringBuilder();

        sb.append(" SELECT * ");
        sb.append(" FROM usuarios AS u INNER JOIN personas AS p ");
        sb.append("     ON u.id_persona = p.id_persona ");
        sb.append(" WHERE tipo_persona = "+tipo_persona+" AND nombre_usuario = '"+tipo_persona+"' AND clave = '"+tipo_persona+"' ");
        
        try {
			Statement cmdValidarTipoPersona = oCnn.createStatement();
			ResultSet rsUsuarios = cmdValidarTipoPersona.executeQuery(sb.toString());
			if (rsUsuarios.next() == true){
        		oCnn.close();
        		return true;
        	}
        	else return false;
		} catch (Exception e) {
			e.printStackTrace();
			System.out.println("ERROR: No se pudo Validar el Tipo de Persona.");
		}
        return false;
    }
	
    public boolean existeUsuario(String nombreUsuario)
    {
        Connection oCnn = crearConexion();
        
        String sql = "SELECT * FROM usuarios WHERE nombre_usuario = '"+nombreUsuario+"'";
        
        try {
        	Statement cmdExisteUsuario = oCnn.createStatement();
			ResultSet rsUsuarios = cmdExisteUsuario.executeQuery(sql);
			if (rsUsuarios.next() == true){
        		oCnn.close();
        		return true;
        	}
        	else return false;
		} catch (Exception e) {
			e.printStackTrace();
			System.out.println("ERROR: No se pudo determinar si existe el Usuario.");
		}
        return false;
    }

    public int getUltimoID()
    {
        Connection oCnn = crearConexion();
        int ultId = 0;
        String sql = "SELECT TOP 1 id_usuario FROM usuarios ORDER BY id_usuario DESC";
        
        try {
        	Statement cmdGetUltimoId = oCnn.createStatement();
        	ResultSet rsUsuarios = cmdGetUltimoId.executeQuery(sql);
        	while (rsUsuarios.next()) {
				ultId = rsUsuarios.getInt("id_usuario");
			}
        	oCnn.close();
			return ultId;
		} catch (Exception e) {
			e.printStackTrace();
			System.out.println("ERROR: No se pudo obtener el ultimo ID");
		}
        return ultId;
    }
	
	public void getUsuarioParaPersona(Persona objPersona)
    {
        Connection oCnn = adDatos.crearConexion();

        Usuario usuarioActual;
        String sql = "SELECT * FROM usuarios WHERE id_persona = "+objPersona.getId()+"";
        
        Statement cmdGetUsuario;
		try {
			cmdGetUsuario = oCnn.createStatement();
			ResultSet rsUsuarios = cmdGetUsuario.executeQuery(sql);
			usuarioActual = new Usuario();
			
			if (rsUsuarios.next()==true){
        		rsUsuarios.beforeFirst();
	        
		        while (rsUsuarios.next()) {
					usuarioActual.setId(rsUsuarios.getInt("id_usuario"));
					usuarioActual.setApellido(rsUsuarios.getString("apellido"));
					usuarioActual.setNombre(rsUsuarios.getString("nombre"));
					usuarioActual.setEmail(rsUsuarios.getString("email"));
					usuarioActual.setNombreUsuario(rsUsuarios.getString("nombre_usuario"));
					usuarioActual.setClave(rsUsuarios.getString("clave"));
					usuarioActual.setHabilitado(rsUsuarios.getBoolean("habilitado"));
					usuarioActual.setIdPersona(rsUsuarios.getInt("id_persona"));
			        
			        objPersona.setUsuario(usuarioActual);
				}
		        oCnn.close();
			}
		} catch (SQLException e) {
			e.printStackTrace();
			System.out.println("ERROR: No se pudo obtener el usuario para la persona.");
		}
    }
	
	public void modificarUsuarioDePersona(Persona objPersona)
    {
		Connection oCnn = adDatos.crearConexion();
        
        StringBuilder sb = new StringBuilder();
        sb.append(" UPDATE usuarios ");
        sb.append(" SET  ");
        sb.append("     apellido = '"+objPersona.getUsuario().getApellido()+"', ");
        sb.append("     nombre = '"+objPersona.getUsuario().getNombre()+"', ");
        sb.append("     email = '"+objPersona.getUsuario().getEmail()+"', ");
        sb.append("     nombre_usuario = '"+objPersona.getUsuario().getNombreUsuario()+"', ");
        sb.append("     clave = '"+objPersona.getUsuario().getClave()+"', ");
        sb.append("     habilitado = "+objPersona.getUsuario().getHabilitado()+" ");
        sb.append(" WHERE id_usuario = "+objPersona.getUsuario().getId()+" ");
        
        Statement cmdModificarUsuario;
		try {
			cmdModificarUsuario = oCnn.createStatement();
			cmdModificarUsuario.executeUpdate(sb.toString());
			oCnn.close();
		} catch (SQLException e) {
			e.printStackTrace();
			System.out.println("ERROR: No se pudo modificar el usuario de la persona.");
		}
    }
	
	

}
